package com.finch.juc;

import java.sql.Time;
import java.util.concurrent.*;

/**
 * @author Levi Wang
 * @create 2021-07-22 23:25
 *
 * 池化技术要能够保证用完之后把那些东西释放
 *
 *四大拒绝策略
 * AbortPolicy: 默认
 * CallerRunsPolicy: 谁调我，我找谁
 * DiscardPolicy： 丢弃
 *DiscardOldestPolicy：
 *
 *
 * 关于如何配置线程池参数，要看你这个任务是CPU密集型还是IO密集型。
 * 如果是CPU密集型，那么就max就配成核数+1
 * 如果是IO密集型，那么配成核数/阻塞系数
 *
 */

public class MyThreadPoolDm {

    public static void main(String[] args) {

//        initPool();

        System.out.println(Runtime.getRuntime().availableProcessors());//输出CPU核数

        //这里注意看一下源码，如果不显示声明，其默认值是多少
        ExecutorService threadPool = new ThreadPoolExecutor(2,
                5,
                2L,
                TimeUnit.SECONDS,
                new LinkedBlockingDeque<>(3),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.DiscardOldestPolicy()); //四大拒绝策略：默认是AbortPolicy,Abort是中断的意思

        try {
            for ( int i = 1; i <= 11; i++) {  //如果小于等于8正常；如果大于8则会出现各种情况，要看拒绝策略
                threadPool.execute( () -> {
                    System.out.println(Thread.currentThread().getName() +"\t请求得到一个线程");
                });
//                try {
//                    TimeUnit.SECONDS.sleep(1);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            threadPool.shutdown();
        }


    }

    private static void initPool() {
        //        ExecutorService threadPool = Executors.newFixedThreadPool(5);//一池5个受理线程，
//        ExecutorService threadPool = Executors.newSingleThreadExecutor();//一池1个受理线程，
        ExecutorService threadPool = Executors.newCachedThreadPool();//一池n个受理线程，可扩容，可伸缩  //阿里巴巴Java开发手册线程池部分，

        try {
            for ( int i = 1; i <= 10; i++) {
                threadPool.execute( () -> {
                    System.out.println(Thread.currentThread().getName() +"\t请求得到一个线程");
                });
//                try {
//                    TimeUnit.SECONDS.sleep(1);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            threadPool.shutdown();
        }
    }


}
